/*
 * @Descripttion: 泛型的使用练习
 * @Author: linzisong
 * @Date: 2021-07-02 15:28:23
 * @LastEditors: linzisong
 * @LastEditTime: 2021-07-02 16:55:27
 */
// 后台返回的接口数据
interface IResponseData<T> {
  code: number;
  message?: string;
  data: T;
}
// 用户接口
interface IResponseUserData {
  id: number;
  username: string;
  email: string;
}
// 文章接口
interface IResponseArticleData {
  id: number;
  title: string;
  author: IResponseUserData;
}

// 调用后台接口定义
async function getData<T>(url: string) {
  let response = await fetch('url')
  let data: IResponseData<T> = await response.json()
  return data
}

// 方法调用
(async function () {
  let userData = await getData<IResponseUserData>('api/user')
  userData.data.email
  let articleData = await getData<IResponseArticleData>('api/atricle')
  articleData.data.author
})()

// 泛型 和 函数中的参数很像，都是因为函数体内无法确定，只有在调用的时候才知道传递的值;
// 如 function add(a, b){ return a + b}，在函数定义中无法知道a,b的值，他是可以任意的，因此通过调用的时候来传递add(a, b)

// typescript强类型语言，对变量、参数的类型都进行了规范，但在函数中会出现同样的问题，在调用方法时，我们无法确方法返回值的类型，只有在调用的时候，才会告诉方法，我需要怎样的类型；
// 如上面的 需要获取用户数据时，data中需要的是username，这时我们也可以定义很多个getData()的方法，比如说getUserData() 或者 getArticleData()，但这样会在一定程度程度上提高代码量
// 代码的复用性不高

